using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NHibernate;
using NHibernate.Criterion;
using Didsoft.DataAccess.Hibernate;

using Didsoft.DataAccess.Contracts;
using SIOGDE.AccesoDatos.Entidades;
using SIOGDE.AccesoDatos.Contratos;
using SIOGDE.AccesoDatos.Entidades.Reportes;

namespace SIOGDE.AccesoDatos.Contexto
{
   public class RequerimientoConfigAccesoDatos : DataAccessBasic<RequerimientoConfig>, IRequerimientoConfigAccesoDatos
   {
     public RequerimientoConfigAccesoDatos()
     {
     }
     
     /// <summary>
     /// Devuelve una lista IList<RequerimientoConfig> con todas las ocurrencias encontradas, en base a filtro.
     /// </summary>
     /// <param name="filtro"></param>
     /// <returns></returns>
     public IList<RequerimientoConfig> BuscarPorFiltro(string filtro)
     {
             //ICriteria criteria = Session.CreateCriteria(typeof(RequerimientoConfig));
             //criteria.Add(Expression.Like("Nombre", filtro+"%")); 
             //return criteria.List<RequerimientoConfig>();

         string hql = "from RequerimientoConfig rc where rc.UnidadMilitar.Nombre like :filtro";
         var query = Session.CreateQuery(hql);
         query.SetAnsiString("filtro", filtro + "%");
         return query.List<RequerimientoConfig>();

     }


     public IList<RequerimientoConfig> BuscarPorFiltro(string filtro, int gestionId)
     {
         //ICriteria criteria = Session.CreateCriteria(typeof(RequerimientoConfig));
         //criteria.Add(Expression.Like("Nombre", filtro+"%")); 
         //return criteria.List<RequerimientoConfig>();

         string hql = "from RequerimientoConfig rc where rc.UnidadMilitar.Nombre like :filtro and rc.Gestion.Id = :gestionId";
         var query = Session.CreateQuery(hql);
         query.SetAnsiString("filtro", "%"+filtro + "%");
         query.SetInt32("gestionId", gestionId);
         return query.List<RequerimientoConfig>();

     }


     public RequerimientoConfig GetPorGuid(string guidRequerimiento)
     {
         string hql = "from RequerimientoConfig um where um.Guid = :guidRequerimiento";
         var query = Session.CreateQuery(hql);
         query.SetAnsiString("guidRequerimiento", guidRequerimiento);
         return query.UniqueResult<RequerimientoConfig>();
     }


     public IList<RequerimientoConfig> GetPorUnidadGuid(string guid, int gestionId)
     {
         string hql = "from RequerimientoConfig rc where rc.UnidadMilitar.Guid = :guid and rc.Gestion.Id = :gestionId";
         var query = Session.CreateQuery(hql);
         query.SetAnsiString("guid", guid);
         query.SetInt32("gestionId", gestionId);
         return query.List<RequerimientoConfig>();
     }


     //public RequerimientoConfig GetDuplicado(RequerimientoConfig entidad)
     //{
     //    var query = Session.QueryOver<RequerimientoConfig>().
     //                Where(p => p.UnidadMilitar.Id == entidad.UnidadMilitar.Id).
     //                And(p => p.Arma.Id == entidad.Arma.Id).
     //                And(p => p.Grado.Id == entidad.Grado.Id).
     //                And(p => p.Especialidad.Id == entidad.Especialidad.Id);
     //    return query.List<RequerimientoConfig>().FirstOrDefault();
     //}

     public bool ExisteDuplicado(RequerimientoConfig entidad)
     {
         string sql = @"declare @UnidadMilitarId int = :UnidadMilitarId,
                                @ArmaId int = :ArmaId,
                                @GradoId int = :GradoId,
                                @EspecialidadId int = :EspecialidadId,
                                @TipoCargoComandoId int = :TipoCargoComandoId 


                        if exists (
			                        select rc.RequerimientoConfigId from RequerimientoConfig rc
			                        inner join UnidadMilitar um on um.UnidadMilitarId = rc.UnidadMilitarId
			                        inner join Arma a on a.ArmaId = rc.ArmaId
			                        inner join Grado g on g.GradoId = rc.GradoId
                                    left join TipoCargoComando tc on tc.TipoCargoComandoId = rc.TipoCargoComandoId
			                        left join Especialidad e on e.EspecialidadId = rc.EspecialidadId
			                        where um.UnidadMilitarId = @UnidadMilitarId
				                          and a.ArmaId = @ArmaId
				                          and g.GradoId = @GradoId
                                          and (tc.TipoCargoComandoId = @TipoCargoComandoId OR @TipoCargoComandoId = 0)
				                          and (e.EspecialidadId = @EspecialidadId OR @EspecialidadId = 0)
                                          and (rc.RequerimientoConfigId <> :RequerimientoConfigId)
	                               )
	                               select 1 as Result
                        else
                                   select 0 as Result	";
         var query = Session.CreateSQLQuery(sql);
         query.SetInt32("UnidadMilitarId", entidad.UnidadMilitar.Id);
         query.SetInt32("ArmaId", entidad.Arma.Id);
         query.SetInt32("GradoId", entidad.Grado.Id);
         query.SetInt32("EspecialidadId", entidad.Especialidad!=null?entidad.Especialidad.Id:0);
         query.SetInt32("TipoCargoComandoId", entidad.TipoCargoComando != null ? entidad.TipoCargoComando.Id : 0);
         query.SetInt32("RequerimientoConfigId", entidad.Id);

         query.AddScalar("Result", NHibernateUtil.Boolean);

         return query.UniqueResult<bool>();

     }


       #region reportes

     public IList<DTORequerimientoConfig> GetConfigReporte(int gestionId, List<string> unidadIds)
     {
         string sql = @" exec siodge_reporte_requerimientoconfig :gestionId, :unidadIds";

         var query = Session.CreateSQLQuery(sql);
         query.SetInt32("gestionId", gestionId);

         if (unidadIds != null && unidadIds.Count > 0)
             query.SetAnsiString("unidadIds", string.Join(",", unidadIds));
         else
             query.SetAnsiString("unidadIds", string.Empty);

         return query.ListBeanTransformer<DTORequerimientoConfig>();

     }

     public IList<DTORequerimientoPorArma> GetRequerimientoPorArma(int gestionId, List<string> armaIds)
     {
         string sql = @" exec siodge_reporte_RequerimientoPorArma :gestionId, :armaIds";

         var query = Session.CreateSQLQuery(sql);
         query.SetInt32("gestionId", gestionId);

         if (armaIds != null && armaIds.Count > 0)
             query.SetAnsiString("armaIds", string.Join(",", armaIds));
         else
             query.SetAnsiString("armaIds", string.Empty);

         return query.ListBeanTransformer<DTORequerimientoPorArma>();

     }


       #endregion

   }
}

